package org.pps.gl.client.vue;

import org.pps.gl.client.GetInfoService;
import org.pps.gl.client.GetInfoServiceAsync;
import org.pps.gl.client.LoginInfo;
import org.pps.gl.client.LoginService;
import org.pps.gl.client.LoginServiceAsync;
import org.pps.gl.client.Pps_gl;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.DialogBox;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.PasswordTextBox;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;

/**
 * Composite pour l'envoi d'un message à un utilisateur
 * 
 */
public class HDR_Reglages extends Composite {
	final static DialogBox reglages = new DialogBox();

	public HDR_Reglages(String mail) {

		reglages.setText("Modification de compte");

		FlexTable flexTable = new FlexTable();
		flexTable.setCellSpacing(5);
		flexTable.setCellPadding(5);
		flexTable.setSize("235px", "55px");

		Label lblTitre1 = new Label("Changer mon mot de passe");
		flexTable.setWidget(0, 0, lblTitre1);

		final PasswordTextBox textBox = new PasswordTextBox();
		flexTable.setWidget(1, 0, textBox);
		textBox.setSize("210px", "20px");

		Button btnModif = new Button("Modifer");
		flexTable.setWidget(1, 1, btnModif);
		btnModif.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				if (textBox.getText().length() < 6)
					Window.alert("Le mot de passe doit faire plus de 6 caractères.");
				else {
					LoginServiceAsync loginService = GWT
							.create(LoginService.class);
					loginService.changerPassword(LoginInfo.getCurrentUser()
							.getEmailAddress(), textBox.getText(),
							new AsyncCallback<Boolean>() {
								public void onFailure(Throwable error) {
									Window.alert("Le mot de passe n'a pas été modifié.");
								}

								public void onSuccess(Boolean result) {
									if (result)
										Window.alert("Le mot de passe a été modifié.");
									else
										Window.alert("Le mot de passe n'a pas été modifié.");
								}
							});

					reglages.hide();
				}
			}
		});

		Label lblTitre2 = new Label("Supprimer mon compte");
		flexTable.setWidget(2, 0, lblTitre2);

		final PasswordTextBox textBox2 = new PasswordTextBox();
		flexTable.setWidget(3, 0, textBox2);
		textBox2.setSize("210px", "20px");

		Button btnSuppr = new Button("Désinscription");
		flexTable.setWidget(3, 1, btnSuppr);
		btnSuppr.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				// vérifier le mot de passe
				LoginServiceAsync loginService = GWT.create(LoginService.class);
				loginService.verifPassword(LoginInfo.getCurrentUser()
						.getEmailAddress(), textBox2.getText(),
						new AsyncCallback<Boolean>() {
							public void onFailure(Throwable error) {
								Window.alert("Le profil n'a pas été trouvé.");
							}

							public void onSuccess(Boolean result) {
								if (result) {
									// On efface l'utilisateur
									effacerUtilisateur(LoginInfo
											.getCurrentUser().getEmailAddress());
								} else
									Window.alert("Le mot de passe n'est pas correct.");
							}

						});
				reglages.hide();
			}
		});

		Button fermer = new Button("Fermer");
		flexTable.setWidget(4, 0, fermer);
		// pour fermer
		fermer.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				reglages.hide();
			}
		});

		reglages.setWidget(flexTable);
		flexTable.getCellFormatter().setHorizontalAlignment(4, 0,
				HasHorizontalAlignment.ALIGN_CENTER);
		reglages.setAnimationEnabled(true);

		Label b = new Label(mail);
		b.addClickHandler(new ClickHandler() {
			public void onClick(ClickEvent event) {
				reglages.center();
			}
		});
		initWidget(b);
	}

	/**
	 * Méthode qui lance l'effacement d'un utilisateur.
	 * 
	 * @param string
	 */
	private void effacerUtilisateur(String user_email) {
		GetInfoServiceAsync infoService = GWT.create(GetInfoService.class);
		infoService.deleteUser(user_email, new AsyncCallback<Boolean>() {
			@Override
			public void onFailure(Throwable caught) {
			}

			@Override
			public void onSuccess(Boolean result) {
				Window.alert("Compte effacé avec succès.");
				Pps_gl.getCm().logout();
			}
		});

	}

	public static void show() {
		reglages.center();
	}

}
